﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Carozos.BE;
using System.Data;
using System.Data.SqlClient;

namespace Carozos.DALC
{
    public class PedidoDALC:SqlDataAccess
    {
        public int insertPedido(PedidoBE pPedido)
        {
            SqlCommand cmd = base.createCommandSP("INSERT_PEDIDO");
            base.addInParameter(cmd, "@idProveedor", pPedido.proveedor.codigo);
            return  base.executeScalar(cmd);
        }

        public void updatePedido(PedidoBE pPedido)
        {
            SqlCommand cmd = base.createCommand("UPDATE Pedido SET idProveedor=@idProveedor, fecha_pedidO=@fecha WHERE id_Pedido=@idPedido");
            base.addInParameter(cmd, "@idPedido", pPedido.codigo);
            base.addInParameter(cmd, "@idProveedor", pPedido.proveedor.codigo);
            base.addInParameter(cmd, "@fecha", pPedido.fecha);
            base.executeNonQuery(cmd);
        }

        public PedidoBE getPedidoByCodigo(int pCodigo)
        {
            PedidoBE pe = null;
            SqlCommand cmd = base.createCommand("SELECT id_pedido, nombre_proveedor, razon_social FROM Pedido p INNER JOIN Proveedor pr ON p.id_proveedor = pr.id_proveedor WHERE id_pedido = @idPedido");
            base.addInParameter(cmd, "@idPedido", pCodigo);
            using (SqlDataReader r = base.executeReader(cmd))
            {
                while (r.Read())
                    pe = new PedidoBE(r.GetInt32(0), new ProveedorBE(r.GetString(1), r.GetString(2)));
            }
            return pe;
        }

        public void addDetallePedido(DetallePedidoBE pDetalle)
        {
            SqlCommand cmd = base.createCommand("INSERT INTO Detalle_Pedido(id_pedido, id_insumo, cantidad_pedido, precio_uni_det_pedido)VALUES(@idPedido,@idInsumo,@cantidad,@precioUnitario)");
            base.addInParameter(cmd, "@idPedido", pDetalle.pedido.codigo);
            base.addInParameter(cmd, "@idInsumo", pDetalle.insumo.codigo);
            base.addInParameter(cmd, "@cantidad", pDetalle.cantidad);
            base.addInParameter(cmd, "@precioUnitario", pDetalle.precioUnitario);
            base.executeNonQuery(cmd);
        }

        public void deleteDetallePedido(DetallePedidoBE pDetalle)
        {
            SqlCommand cmd = base.createCommand("Delete Detalle_Pedido WHERE id_detalle_pedido=@idDetallePedido");
            base.addInParameter(cmd, "@idDetallePedido", pDetalle.codigo);
            base.executeNonQuery(cmd);
        }

        public void updateDetallePedido(DetallePedidoBE pDetalle)
        {
            SqlCommand cmd = base.createCommand("Update Detalle_Pedido SET cantidad_pedido = @cantidad, precio_uni_det_pedido=@precio WHERE id_detalle_pedido = @codigo");
            base.addInParameter(cmd, "@codigo", pDetalle.codigo);
            base.addInParameter(cmd, "@cantidad", pDetalle.cantidad);
            base.addInParameter(cmd, "@precio", pDetalle.precioUnitario);
            base.executeNonQuery(cmd);
        }

        public List<DetallePedidoBE> getDetallesByCodigoPedido(PedidoBE pPedido)
        {
            List<DetallePedidoBE> lista = new List<DetallePedidoBE>();
            SqlCommand cmd = base.createCommand("SELECT id_detalle_pedido,id_detalle_pedido,nombre_insumo,marca_insumo,comentario_insumo, cantidad_pedido, precio_uni_det_pedido FROM Detalle_Pedido d INNER JOIN Insumo i ON d.id_insumo= i.id_insumo AND id_pedido=@idPedido");
            base.addInParameter(cmd, "@idPedido", pPedido.codigo);
            using (SqlDataReader r = base.executeReader(cmd))
            {
                while (r.Read())
                    lista.Add(createObject(r));
            }
            return lista;
        }

        private DetallePedidoBE createObject(SqlDataReader reader)
        {
            DetallePedidoBE det = new DetallePedidoBE(reader.GetInt32(0), new PedidoBE(reader.GetInt32(1)), new InsumoBE(reader.GetString(2), reader.GetString(3),reader.GetString(4)),
                                                       reader.GetInt32(5),reader.GetDecimal(6));
            return det;
        }

    }
}
